import { AxiosPromise, AxiosRequestConfig, AxiosResponse } from "../type";
import { transformRequest, transformResponse } from "./helpers/data";
import { processHeaders } from "./helpers/headers";
import { bulidURL } from "./helpers/url";
import xhr from "./xhr";

export default function axios(config: AxiosRequestConfig): AxiosPromise{
  processConfig(config);
  return xhr(config).then(res => {
    return transformResponseData(res);
  })
}

function processConfig(config: AxiosRequestConfig): void {
  config.url = transformUrl(config);
  config.headers = transformHeaders(config);
  config.data = transformRequestData(config);
}

// url 处理
function transformUrl (config: AxiosRequestConfig): string{
  const {url, params} = config;
  return bulidURL(url, params);
}
// data 处理
function transformRequestData(config: AxiosRequestConfig): any{
  const {data} = config;
  return transformRequest(data);
}
// 处理header
function transformHeaders(config: AxiosRequestConfig): any{
  const {headers = {},data} = config;
  return processHeaders(headers,data);
}

function transformResponseData(res: AxiosResponse): AxiosResponse {
  res.data = transformResponse(res.data);
  return res;
}
